#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"

unsigned int IR_Time;
unsigned char IR_State;
unsigned char IR_Data[4];
unsigned char IR_pData;
unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;

/**
  * @brief  初始化红外遥控
  * @param  无
  * @retval 无
  */
void IR_Init(void)
{
	Timer0_Init();
	Int0_Init();
}

/**
  * @brief  获取到数据标志
  * @param  无
	* @retval 如果获取到数据返回1，否则为0
  */
unsigned char IR_GetDataFlag(void)
{
	if(IR_DataFlag)
	{
		IR_DataFlag=0;
		return 1;
	}
	return 0;
}


/**
  * @brief  重发标志位
  * @param  无
	* @retval 如果获取到重发返回1，否则为0
  */
unsigned char IR_GetRepeatFlag(void)
{
	if(IR_RepeatFlag)
	{
		IR_RepeatFlag=0;
		return 1;
	}
	return 0;
}

/**
  * @brief  返回红外地址
  * @param  无
  * @retval 红外地址
  */
unsigned char IR_GetAddress(void)
{
	return IR_Address;
}

/**
  * @brief  获取接收到数据
  * @param  无
  * @retval 接收到数据
  */
unsigned char IR_GetCommand(void)
{
	return IR_Command;
}


//外部中断0中断函数，下降沿触发执行

/**
  * @brief  进行地址和数据的获取
  */
void Int0_Routine(void) interrupt 0
{
	if(IR_State==0)//空闲状态
	{
		
		Timer0_SetCounter(0);
		Timer0_Run(1);
		IR_State=1; //定时到启动状态
	}
	else if(IR_State==1)//待检测状态
	{
		
		IR_Time=Timer0_GetCounter();//获取执行时间
		Timer0_SetCounter(0); //计时清零
		if(IR_Time > 12442-500 && IR_Time < 12442+500)//开始标志
		{
			IR_State=2;//开始解码数据;状态2
		}
		else if(IR_Time > 10368-500 && IR_Time < 10368+500) //结束标志
		{
			IR_RepeatFlag=1;//重新开始标志
			Timer0_Run(0);
			IR_State=0;
		}
		else //有错误
		{
			IR_State=1;
		}
	}
	else if(IR_State==2)
	{
		IR_Time=Timer0_GetCounter();//获取执行时间
		Timer0_SetCounter(0); //计时清零
		if(IR_Time > 1032-500 && IR_Time < 1032+500)//接受数据位0
		{
			
			IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));	//数据对应位清0
			IR_pData++;			//数据位置指针自增
		}
		else if(IR_Time > 2074-500 && IR_Time < 2074+500)//接收数据为1
		{
			
			IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));
			IR_pData++;		//数据位置指针自增
		}
		else //结束错误
		{
			IR_pData=0;
			IR_State=1;
		}
		if(IR_pData>=32)
		{
			IR_pData=0;
			if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))//接收数据成功
			{
				IR_Address=IR_Data[0];
				IR_Command=IR_Data[2];
				IR_DataFlag=1;//接收数据成功标志
			}
			Timer0_Run(0);//停止定时器
			IR_State=0; //回到空闲状态
		}
	}
}